# -*- coding: utf-8 -*-

import pika
import pika.exceptions
from spider.crawl import do_crawl
import json
from bson import ObjectId
from config import MONGO_DB_SERVER, MQ_SERVER, MONGO_DB_USER, MONGO_DB_PWD
from utils import common_logger, get_mongodb
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities


logger = common_logger.get_logger(__name__, 'spider.log')


def start_spider():
    # conn = MongoClient('mongodb://%s:%s@%s:%s' % (MONGO_DB_USER, MONGO_DB_PWD, MONGO_DB_SERVER, 27017))

    db = get_mongodb('crawl')

    task_collect = db.crawl_task

    connection = pika.BlockingConnection(pika.ConnectionParameters(host=MQ_SERVER))
    channel = connection.channel()
    channel.basic_qos(0, 10, False)

    mq_args = {"x-message-ttl": 6000000}
    channel.queue_declare(queue='to_crawl', durable=True, arguments=mq_args)
    dcap = dict(DesiredCapabilities.PHANTOMJS)  # 设置userAgent
    dcap["phantomjs.page.settings.userAgent"] = (
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0 ")

    chrome_opt = webdriver.ChromeOptions()
    chrome_opt.add_argument('--headless')
    chrome_opt.add_argument('--disable-gpu')
    chrome_opt.add_argument(
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0 ')
    obj = webdriver.Chrome(chrome_options=chrome_opt, desired_capabilities=dcap)
    obj.set_window_size(1280, 800)
    obj.set_page_load_timeout(10)
    # 设置10秒脚本超时时间
    obj.set_script_timeout(10)
    logger.info('webdriver is inited over')

    def callback(ch, method, properties, body):
        logger.info(" [x] Received %r" % body)
        try:
            req = json.loads(body.decode('utf-8'))
            if req.get('task'):
                tasks = task_collect.find({'_id': ObjectId(req.get('task'))})

                for task in tasks:
                    url = task.get('links')
                    if req.get('url'):
                        url = req.get('url')
                    logger.info(type(url))
                    if type(url) != list:
                        url = [url]
                    do_crawl(task.get('rule'), url, obj)
                    channel.basic_ack(method.delivery_tag, False)
        except pika.exceptions.ChannelClosed as exc:
            logger.exception(exc)
            obj.quit()  # 关闭浏览器。当出现异常时记得在任务浏览器中关闭PhantomJS，因为会有多个PhantomJS在运行状态，影响电脑性能
            raise Exception('connect refused')
        except Exception as exc:
            logger.exception(exc)

    channel.basic_consume(callback,
                          queue='to_crawl',
                          no_ack=False)

    channel.start_consuming()


rule = {
    'title': '根节点',
    'type': 'list',
    'xpath': '//html',
    'nodes': [
        {
            'title': '',
            'type': 'element',
            'xpath': './/div[@class="overview"]//div[@class="compareBtn LOGCLICK"]',
            'nodes': [
                {
                    'title': '',
                    'type': 'attr',
                    'attr_key': 'log-mod',
                    'col_key': 'code',
                },
            ]
        },
        {
            'title': '',
            'type': 'element',
            'xpath': './/div[@class="overview"]//div[@class="houseInfo"]',
            'nodes': [
                {
                    'title': '',
                    'type': 'element',
                    'xpath': './/div[@class="room"]/div[@class="mainInfo"]',
                    'nodes': [
                        {
                            'title': '',
                            'type': 'attr',
                            'attr_key': 'innerText',
                            'col_key': 'house_type',
                        },
                    ]
                },
                {
                    'title': '',
                    'type': 'element',
                    'xpath': './/div[@class="room"]/div[@class="subInfo"]',
                    'nodes': [
                        {
                            'title': '',
                            'type': 'attr',
                            'attr_key': 'innerText',
                            'col_key': 'floor',
                        },
                    ]
                },
            ]
        },
        {
            'title': '',
            'type': 'element',
            'xpath': './/div[@class="overview"]//div[@class="houseInfo"]',
            'nodes': [
                {
                    'title': '',
                    'type': 'element',
                    'xpath': './/div[@class="type"]/div[@class="mainInfo"]',
                    'nodes': [
                        {
                            'title': '',
                            'type': 'attr',
                            'attr_key': 'innerText',
                            'col_key': 'orientation',
                        },
                    ]
                },
                {
                    'title': '',
                    'type': 'element',
                    'xpath': './/div[@class="type"]/div[@class="subInfo"]',
                    'nodes': [
                        {
                            'title': '',
                            'type': 'attr',
                            'attr_key': 'innerText',
                            'col_key': 'fitment',
                        },
                    ]
                },
            ]
        },
        {
            'title': '',
            'type': 'element',
            'xpath': './/div[@class="overview"]//div[@class="houseInfo"]',
            'nodes': [
                {
                    'title': '',
                    'type': 'element',
                    'xpath': './/div[@class="area"]/div[@class="mainInfo"]',
                    'nodes': [
                        {
                            'title': '',
                            'type': 'attr',
                            'attr_key': 'innerText',
                            'col_key': 'size',
                        },
                    ]
                },
                {
                    'title': '',
                    'type': 'element',
                    'xpath': './/div[@class="area"]/div[@class="subInfo"]',
                    'nodes': [
                        {
                            'title': '',
                            'type': 'attr',
                            'attr_key': 'innerText',
                            'col_key': 'yearold',
                        },
                    ]
                },
            ]
        },
        {
            'title': '',
            'type': 'element',
            'xpath': './/div[@class="aroundInfo"]//div[@class="communityName"]/a[@class="info "]',
            'nodes': [
                {
                    'title': '',
                    'type': 'attr',
                    'attr_key': 'innerText',
                    'col_key': 'xiaoqu',
                },
            ]
        },
        {
            'title': '',
            'type': 'element',
            'xpath': './/div[@class="aroundInfo"]//div[@class="areaName"]/span[@class="info"]',
            'nodes': [
                {
                    'title': '',
                    'type': 'attr',
                    'attr_key': 'innerText',
                    'col_key': 'quyu',
                    'split': {
                        'split_text': ' ',
                        'split_rules': [
                            {
                                'position': 0,
                                'col_key': 'region',
                            },
                            {
                                'position': 1,
                                'col_key': 'xian',
                            },
                            {
                                'position': 2,
                                'col_key': 'position',
                            },
                        ]
                    }
                },
            ]
        },
        {
            'title': '',
            'type': 'element',
            'xpath': './/div[@class="overview"]//div[@class="price "]/span[@class="total"]',
            'nodes': [
                {
                    'title': '',
                    'type': 'attr',
                    'attr_key': 'innerText',
                    'col_key': 'total_price',
                },
            ]
        },
        {
            'title': '',
            'type': 'element',
            'xpath': './/div[@class="overview"]//div[@class="price"]//span[@class="unitPriceValue"]',
            'nodes': [
                {
                    'title': '',
                    'type': 'attr',
                    'attr_key': 'innerText',
                    'col_key': 'unit_price',
                },
            ]
        },
        {
            'title': '',
            'type': 'element',
            'xpath': './/div[@class="m-content"]//div[@class="transaction"]/div[@class="content"]',
            'nodes': [
                {
                    'title': '',
                    'type': 'attr',
                    'attr_key': 'innerText',
                    'col_key': 'transaction',
                    'split': {
                        'split_text': ' ',
                        'split_rules': [
                            {
                                'position': 1,
                                'col_key': 'publist_date',
                            },
                            {
                                'position': 2,
                                'col_key': 'publist_date1',
                            },
                            {
                                'position': 3,
                                'col_key': 'quanshu',
                            },
                            {
                                'position': 4,
                                'col_key': 'quanshu1',
                            },
                            {
                                'position': 5,
                                'col_key': 'last_due_date',
                            },
                            {
                                'position': 6,
                                'col_key': 'last_due_date1',
                            },
                            {
                                'position': 7,
                                'col_key': 'fangwu_yongtu',
                            },
                            {
                                'position': 8,
                                'col_key': 'fangwu_yongtu1',
                            },
                            {
                                'position': 9,
                                'col_key': 'nianxian1',
                            },
                            {
                                'position': 11,
                                'col_key': 'chanquansuoshu',
                            },
                            {
                                'position': 12,
                                'col_key': 'chanquansuoshu1',
                            },
                            {
                                'position': 13,
                                'col_key': 'diyaxinxi',
                            },
                            {
                                'position': 14,
                                'col_key': 'fangben',
                            },
                            {
                                'position': 15,
                                'col_key': 'fangben1',
                            },
                        ]
                    }
                },
            ]
        },
        {
            'title': '',
            'type': 'element',
            'xpath': './/div[@class="m-content"]//div[@class="introContent"]/div[@class="base"]/div[@class="content"]',
            'nodes': [
                {
                    'title': '',
                    'type': 'attr',
                    'attr_key': 'innerText',
                    'col_key': 'transaction1',
                    'split': {
                        'split_text': ' ',
                        'split_rules': [
                            {
                                'position': 0,
                                'col_key': 'base0',
                            },
                            {
                                'position': 1,
                                'col_key': 'base1',
                            },
                            {
                                'position': 2,
                                'col_key': 'base2',
                            },
                            {
                                'position': 3,
                                'col_key': 'base3',
                            },
                            {
                                'position': 4,
                                'col_key': 'base4',
                            },
                            {
                                'position': 5,
                                'col_key': 'base5',
                            },
                            {
                                'position': 6,
                                'col_key': 'base6',
                            },
                            {
                                'position': 7,
                                'col_key': 'base7',
                            },
                            {
                                'position': 8,
                                'col_key': 'base8',
                            },
                            {
                                'position': 9,
                                'col_key': 'base9',
                            },
                            {
                                'position': 10,
                                'col_key': 'base10',
                            },
                            {
                                'position': 11,
                                'col_key': 'base11',
                            }
                        ]
                    }
                },
            ]
        }
    ]
}
print(json.dumps(rule))
